home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / OpenDoc 1.2b2c1 / Implementation / Imaging / CanvasB.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-13  |  13.5 KB  |  452 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        CanvasB.cpp
  3.  
  4.     Contains:    ODBaseCanvas, an abstract drawing environment.
  5.  
  6.     Owned by:    Jens Alfke, Joshua Susser
  7.  
  8.     Copyright:    © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <2>     9/24/96    eeh        1315228: Verify part wrapper passed
  13.         <17>     8/29/95    jpa        Use TempODShape to avoid checking result of
  14.                                     'new ODShape'. [1279066]
  15.         <16>      8/3/95    RR        #1257260: Collapse B classes. Remove
  16.                                     somInit methods. Don't call IsInitialized
  17.                                     or SubclassResponsibility
  18.         <15>      6/1/95    jpa        Removed CheckUpdateShape. [1232306]
  19.         <14>     5/26/95    RR        #1251403: Multithreading naming support
  20.         <13>      5/4/95    jpa        Fixed bad TRY block in GetOwner. [1246060]
  21.         <12>     3/31/95    jpa        Fixed crash in GetUpdateShape for onscreen
  22.                                     canvases. [1223422]
  23.         <11>     3/22/95    jpa        Use new ODPlatformPrintJob type. [1230236]
  24.         <10>     3/20/95    jpa        SOM_CATCH --> SOM_TRY [1224355]
  25.          <9>     1/13/95    RR        Check for null in GetBiasTransform
  26.          <8>    12/20/94    jpa        GetUpdateShape increments shape's refcount
  27.                                     [1207402]
  28.          <7>     12/5/94    jpa        Fixes from code review. [1203923]
  29.          <6>    10/24/94    jpa        Include Trnsform.xh. Initialize
  30.                                     fUpdateShape. [1153437, 1165562]
  31.          <5>     9/29/94    RA        1189812: Mods for 68K build.
  32.          <4>     8/17/94    jpa        Function prefixes. [1181512]
  33.          <3>      8/8/94    jpa        API changes for multiformat canvases & bias
  34.                                     transforms [1179683, 1178688]
  35.          <2>     7/13/94    jpa        Call InitObject in InitBaseCanvas.
  36.          <1>     6/15/94    jpa        first checked in
  37.  
  38.     To Do:
  39.     In Progress:
  40.         
  41. */
  42.  
  43. #ifndef _ALTPOINT_
  44. #include "AltPoint.h"
  45. #endif
  46.  
  47. #define ODBaseCanvas_Class_Source
  48. #define VARIABLE_MACROS
  49. #include <CanvasB.xih>
  50.  
  51. #ifndef SOM_ODPart_xh
  52. #include <Part.xh>
  53. #endif
  54.  
  55. #ifndef SOM_ODShape_xh
  56. #include <Shape.xh>
  57. #endif
  58.  
  59. #ifndef SOM_ODTransform_xh
  60. #include <Trnsform.xh>
  61. #endif
  62.  
  63. #ifndef _EXCEPT_
  64. #include <Except.h>
  65. #endif
  66.  
  67. #ifndef _ODUTILS_
  68. #include <ODUtils.h>
  69. #endif
  70.  
  71. #ifndef _TEMPOBJ_
  72. #include <TempObj.h>
  73. #endif
  74.  
  75.  
  76. //------------------------------------------------------------------------------
  77. // somUninit
  78. //------------------------------------------------------------------------------
  79.  
  80. SOM_Scope void  SOMLINK ODBaseCanvas__somUninit(ODBaseCanvas *somSelf)
  81. {
  82.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  83.     ODBaseCanvasMethodDebug("ODBaseCanvas","somUninit");
  84.     
  85.     ODSafeReleaseObject( _fOwner );
  86.     ODSafeReleaseObject( _fUpdateShape );
  87.     ODSafeReleaseObject( _fBiasTransform );
  88.     
  89.     ODBaseCanvas_parents_somUninit(somSelf);
  90. }
  91.  
  92. //------------------------------------------------------------------------------
  93. // InitBaseCanvas
  94. //------------------------------------------------------------------------------
  95.  
  96. SOM_Scope void  SOMLINK ODBaseCanvas__InitBaseCanvas(ODBaseCanvas *somSelf, Environment *ev,
  97.         ODBoolean isDynamic,
  98.         ODBoolean isOffscreen)
  99. {
  100.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  101.     ODBaseCanvasMethodDebug("ODBaseCanvas","InitBaseCanvas");
  102.     
  103.     SOM_TRY
  104.  
  105.     /* Moved from somInit. SOM itself sets fields to zero
  106.     _fOwner = kODNULL;
  107.     _fUpdateShape = kODNULL;
  108.     _fFacet = kODNULL;
  109.     _fIsDynamic = kODTrue;
  110.     _fIsOffscreen = kODFalse;
  111.     _fBiasTransform = kODNULL;
  112.     _fPlatformPrintJob = kODNULL;
  113.     */
  114.     _fPrintJobGraphicsSystem = kODNoGraphicsSystem;
  115.  
  116.     somSelf->InitObject(ev);
  117.  
  118.     _fIsDynamic = isDynamic;
  119.     _fIsOffscreen = isOffscreen;
  120.  
  121.     SOM_CATCH_ALL
  122.     SOM_ENDTRY
  123. }
  124.  
  125. //------------------------------------------------------------------------------
  126. // GetOwner
  127. //------------------------------------------------------------------------------
  128.  
  129. SOM_Scope ODPart*  SOMLINK ODBaseCanvas__AcquireOwner(ODBaseCanvas *somSelf, Environment *ev)
  130. {
  131.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  132.     ODBaseCanvasMethodDebug("ODBaseCanvas","AcquireOwner");
  133.  
  134.     if( _fOwner ) {
  135.         SOM_TRY
  136.             _fOwner->Acquire(ev);
  137.         SOM_CATCH_ALL
  138.         SOM_ENDTRY
  139.     }
  140.     return _fOwner;
  141. }
  142.  
  143. //------------------------------------------------------------------------------
  144. // SetOwner
  145. //------------------------------------------------------------------------------
  146.  
  147. SOM_Scope void  SOMLINK ODBaseCanvas__SetOwner(ODBaseCanvas *somSelf, Environment *ev,
  148.         ODPart* owner)
  149. {
  150.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  151.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetOwner");
  152.     
  153.     WASSERT_IS_PART_WRAPPER( ev, owner );
  154.     if( owner != _fOwner ) {
  155.         SOM_TRY
  156.             ODTransferReference(ev,_fOwner,owner);
  157.             _fOwner = owner;
  158.         SOM_CATCH_ALL
  159.         SOM_ENDTRY
  160.     }
  161. }
  162.  
  163. //------------------------------------------------------------------------------
  164. // GetFacet
  165. //------------------------------------------------------------------------------
  166.  
  167. SOM_Scope ODFacet*  SOMLINK ODBaseCanvas__GetFacet(ODBaseCanvas *somSelf, Environment *ev)
  168. {
  169.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  170.     ODBaseCanvasMethodDebug("ODBaseCanvas","GetFacet");
  171.  
  172.     return _fFacet;
  173. }
  174.  
  175. //------------------------------------------------------------------------------
  176. // SetFacet
  177. //------------------------------------------------------------------------------
  178.  
  179. SOM_Scope void  SOMLINK ODBaseCanvas__SetFacet(ODBaseCanvas *somSelf, Environment *ev,
  180.         ODFacet* facet)
  181. {
  182.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  183.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetFacet");
  184.  
  185.     _fFacet = facet;
  186. }
  187.  
  188. //------------------------------------------------------------------------------
  189. // IsDynamic
  190. //------------------------------------------------------------------------------
  191.  
  192. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__IsDynamic(ODBaseCanvas *somSelf, Environment *ev)
  193. {
  194.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  195.     ODBaseCanvasMethodDebug("ODBaseCanvas","IsDynamic");
  196.  
  197.     return _fIsDynamic;
  198. }
  199.  
  200. //------------------------------------------------------------------------------
  201. // IsOffscreen
  202. //------------------------------------------------------------------------------
  203.  
  204. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__IsOffscreen(ODBaseCanvas *somSelf, Environment *ev)
  205. {
  206.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  207.     ODBaseCanvasMethodDebug("ODBaseCanvas","IsOffscreen");
  208.  
  209.     return _fIsOffscreen;
  210. }
  211.  
  212. //------------------------------------------------------------------------------
  213. // HasPlatformCanvas
  214. //------------------------------------------------------------------------------
  215.  
  216. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__HasPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
  217.         ODGraphicsSystem g)
  218. {
  219.     WARN("A subclass should have overridden this method!");
  220.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  221.     return kODFalse;
  222. }
  223.  
  224.  
  225. //------------------------------------------------------------------------------
  226. // GetPlatformCanvas
  227. //------------------------------------------------------------------------------
  228.  
  229. SOM_Scope ODPlatformCanvas  SOMLINK ODBaseCanvas__GetPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
  230.         ODGraphicsSystem g)
  231. {
  232.     WARN("A subclass should have overridden this method!");
  233.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  234.     return kODNULL;
  235. }
  236.  
  237. //------------------------------------------------------------------------------
  238. // SetPlatformCanvas
  239. //------------------------------------------------------------------------------
  240.  
  241. SOM_Scope void  SOMLINK ODBaseCanvas__SetPlatformCanvas(ODBaseCanvas *somSelf, Environment *ev,
  242.         ODGraphicsSystem g,
  243.         ODPlatformCanvas c)
  244. {
  245.     WARN("A subclass should have overridden this method!");
  246.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  247. }
  248.  
  249. //------------------------------------------------------------------------------
  250. // HasPlatformPrintJob
  251. //------------------------------------------------------------------------------
  252.  
  253. SOM_Scope ODBoolean  SOMLINK ODBaseCanvas__HasPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
  254.         ODGraphicsSystem g)
  255. {
  256.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  257.     ODBaseCanvasMethodDebug("ODBaseCanvas","HasPlatformPrintJob");
  258.     
  259.     // This base implementation can only keep track of one graphics system's print job at
  260.     // a time; it seems unlikely that a print job would be run by more than one graphics
  261.     // system at once. If you really need to store more than one (as is done with platform
  262.     // canvases) then just override the 3 PlatformPrintJob methods in your platform subclass.
  263.  
  264.     return _fPlatformPrintJob!=kODNULL && g==_fPrintJobGraphicsSystem;
  265. }
  266.  
  267. //------------------------------------------------------------------------------
  268. // GetPlatformPrintJob
  269. //------------------------------------------------------------------------------
  270.  
  271. SOM_Scope ODPlatformPrintJob  SOMLINK ODBaseCanvas__GetPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
  272.         ODGraphicsSystem g)
  273. {
  274.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  275.     ODBaseCanvasMethodDebug("ODBaseCanvas","GetPlatformPrintJob");
  276.  
  277.     if( _fPlatformPrintJob!=kODNULL && g==_fPrintJobGraphicsSystem )
  278.         return _fPlatformPrintJob;
  279.     else {
  280.         ODSetSOMException(ev, kODErrInvalidGraphicsSystem);
  281.         return kODNULL;
  282.     }
  283. }
  284.  
  285. //------------------------------------------------------------------------------
  286. // SetPlatformPrintJob
  287. //------------------------------------------------------------------------------
  288.  
  289. SOM_Scope void  SOMLINK ODBaseCanvas__SetPlatformPrintJob(ODBaseCanvas *somSelf, Environment *ev,
  290.         ODGraphicsSystem g,
  291.         ODPlatformPrintJob j)
  292. {
  293.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  294.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetPlatformPrintJob");
  295.  
  296.     _fPrintJobGraphicsSystem = g;
  297.     _fPlatformPrintJob = j;
  298. }
  299.  
  300. //------------------------------------------------------------------------------
  301. // GetUpdateShape
  302. //------------------------------------------------------------------------------
  303.  
  304. SOM_Scope ODShape*  SOMLINK ODBaseCanvas__AcquireUpdateShape(ODBaseCanvas *somSelf, Environment *ev)
  305. {
  306.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  307.     ODBaseCanvasMethodDebug("ODBaseCanvas","AcquireUpdateShape");
  308.     
  309.     SOM_TRY
  310.  
  311.     if( !_fUpdateShape )
  312.         somSelf->ResetUpdateShape(ev);
  313.     if( _fUpdateShape )
  314.         _fUpdateShape->Acquire(ev);
  315.     return _fUpdateShape;
  316.  
  317.     SOM_CATCH_ALL
  318.     SOM_ENDTRY
  319.     return kODNULL;
  320. }
  321.  
  322. //------------------------------------------------------------------------------
  323. // ResetUpdateShape
  324. //------------------------------------------------------------------------------
  325.  
  326. SOM_Scope void  SOMLINK ODBaseCanvas__ResetUpdateShape(ODBaseCanvas *somSelf, Environment *ev)
  327. {
  328.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  329.     ODBaseCanvasMethodDebug("ODBaseCanvas","ResetUpdateShape");
  330.     
  331.     if( !_fIsOffscreen )
  332.         return;
  333.     
  334.     SOM_TRY
  335.  
  336.     if( !_fUpdateShape ) {
  337.         // Create a new, empty update shape. It would be nice to use a factory,
  338.         // but from here there's no factory object we can reach...
  339.         TempODShape s = new ODShape;
  340.         THROW_IF_NULL(s);
  341.         s->InitShape(ev);
  342.         _fUpdateShape = s.DontRelease();
  343.             
  344.     } else {
  345.         // Just clear the update shape:
  346.         ODRect empty(0,0,0,0);
  347.         _fUpdateShape->SetRectangle(ev,&empty);
  348.     }
  349.  
  350.     SOM_CATCH_ALL
  351.     SOM_ENDTRY
  352. }
  353.  
  354. //------------------------------------------------------------------------------
  355. // ComputeBiasTransform
  356. //------------------------------------------------------------------------------
  357.  
  358. SOM_Scope void  SOMLINK ODBaseCanvas__ComputeBiasTransform(
  359.                                             ODBaseCanvas *somSelf, Environment *ev)
  360. {
  361. //    ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  362.     ODBaseCanvasMethodDebug("ODBaseCanvas","ComputeBiasTransform");
  363.  
  364.     // Do nothing by default.
  365. }
  366.  
  367. //------------------------------------------------------------------------------
  368. // GetBiasTransform
  369. //------------------------------------------------------------------------------
  370.  
  371. SOM_Scope ODTransform*  SOMLINK ODBaseCanvas__AcquireBiasTransform(ODBaseCanvas *somSelf, Environment *ev)
  372. {
  373.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  374.     ODBaseCanvasMethodDebug("ODBaseCanvas","GetBiasTransform");
  375.  
  376.     SOM_TRY
  377.     if (_fBiasTransform)
  378.         _fBiasTransform->Acquire(ev);
  379.     return _fBiasTransform;
  380.  
  381.     SOM_CATCH_ALL
  382.     SOM_ENDTRY
  383.     return kODNULL;
  384. }
  385.  
  386. //------------------------------------------------------------------------------
  387. // SetBiasTransform
  388. //------------------------------------------------------------------------------
  389.  
  390. SOM_Scope void  SOMLINK ODBaseCanvas__SetBiasTransform(ODBaseCanvas *somSelf, Environment *ev,
  391.         ODTransform* x)
  392. {
  393.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  394.     ODBaseCanvasMethodDebug("ODBaseCanvas","SetBiasTransform");
  395.  
  396.     if( x != _fBiasTransform ) {
  397.         SOM_TRY
  398.     
  399.             ODTransferReference(ev,_fBiasTransform,x);
  400.             _fBiasTransform = x;
  401.  
  402.         SOM_CATCH_ALL
  403.         SOM_ENDTRY
  404.     }
  405. }
  406.  
  407. //------------------------------------------------------------------------------
  408. // Invalidate
  409. //------------------------------------------------------------------------------
  410.  
  411. SOM_Scope void  SOMLINK ODBaseCanvas__Invalidate(ODBaseCanvas *somSelf, Environment *ev,
  412.         ODShape* shape)
  413. {
  414.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  415.     ODBaseCanvasMethodDebug("ODBaseCanvas","Invalidate");
  416.  
  417.     if ( !_fIsOffscreen )
  418.         return;
  419.         
  420.     SOM_TRY
  421.  
  422.     if( !_fUpdateShape )
  423.         somSelf->ResetUpdateShape(ev);
  424.     _fUpdateShape->Union(ev,shape);
  425.  
  426.     SOM_CATCH_ALL
  427.     SOM_ENDTRY
  428. }
  429.  
  430. //------------------------------------------------------------------------------
  431. // Validate
  432. //------------------------------------------------------------------------------
  433.  
  434. SOM_Scope void  SOMLINK ODBaseCanvas__Validate(ODBaseCanvas *somSelf, Environment *ev,
  435.         ODShape* shape)
  436. {
  437.     ODBaseCanvasData *somThis = ODBaseCanvasGetData(somSelf);
  438.     ODBaseCanvasMethodDebug("ODBaseCanvas","Validate");
  439.  
  440.     if ( !_fIsOffscreen )
  441.         return;
  442.  
  443.     SOM_TRY
  444.  
  445.     if( !_fUpdateShape )
  446.         somSelf->ResetUpdateShape(ev);
  447.     _fUpdateShape->Subtract(ev,shape);
  448.  
  449.     SOM_CATCH_ALL
  450.     SOM_ENDTRY
  451. }
  452.